package hxy.bytecode.algorithm;

import java.util.*;

public class StackTest {

	public static void main(String[] args) {
		final Integer INT = 11111;
		final String STRING = "abcdefg";
		final Double DOUBLE = 3.1415926;
		Stack<Object> stack = new Stack<Object>(); // 创建堆栈对象,Java8中是需要指明泛型的类型！如果是多种类型，那就指定为Object就可以了
		System.out.format("%d, %s, %f 三个元素入栈\n", INT,STRING,DOUBLE);
		
		stack.push(new Integer(INT)); // 向栈中压入整数 11111
		printStack(stack); // 显示栈中的所有元素

		stack.push(STRING); // 向栈中压入
		printStack(stack); // 显示栈中的所有元素

		stack.push(new Double(3.1415926)); // 向 栈中 压入
		printStack(stack); // 显示栈中的所有元素

		String s = new String("abcdefg");
		System.out.println("元素abcdefg在堆栈的位置：" + stack.search(s));
		System.out.println("元素11111在堆栈的位置：" + stack.search(11111));

		System.out.println("11111, abcdefg, 3.1415926 三个元素出栈"); // 弹出 栈顶元素
		System.out.println("元素" + stack.pop() + "出栈");
		printStack(stack); // 显示栈中的所有元素
		System.out.println("元素" + stack.pop() + "出栈");
		printStack(stack); // 显示栈中的所有元素
		System.out.println("元素" + stack.pop() + "出栈");
		printStack(stack); // 显示栈中的所有元素

	}

	private static void printStack(Stack<Object> stack) {
		if (stack.empty())
			System.out.println("堆栈是空的，没有元素!");
		else {
			System.out.print("堆栈中的元素：");
			// 这个地方是栈的设计有关，如果要遍历栈，不能直接把栈倒出一遍。应该把栈赋值给枚举，这样才能正确的遍历栈而不会破坏栈的元素。
			Enumeration<Object> items = stack.elements(); // 得到 stack 中的枚举对象
			while (items.hasMoreElements()) // 显示枚举（stack ） 中的所有元素
				System.out.print(items.nextElement() + " ");
		}
		System.out.println(); // 换行
	}
}
